package nexus.align
{
	/**
	 * IA 경로   : common - winnie  <br>
	 * 설명         : HBox, VBox 베이스 정렬 클래스 <br>
	 * 최초 작성  : 김정환D - Xprime <br> 
	 * 수정         : <br>  
	 */
	public class BaseAlignBox
	{
		
		// 아이템 리스트
		protected var _itemList : Vector.<AlignObject> = new Vector.<AlignObject>();
		
		// 패딩값
		protected var _padding : Array = [0,0,0,0];
		
		// 시작점 x
		protected var _x : Number = 0;
		
		// 시작점 y 
		protected var _y : Number = 0;
		
		protected var _cellNum : int = 0;
		
		protected var _minCellSize : Array = [];
		
		protected var _alignList : Array = [];
		
		/**
		 * 수많은 아이템 자동정렬을 위한 정렬 팩토리
		 */	
		public function BaseAlignBox( __cellNum : int = 0, __minCellSize :Array = null, __alignList :Array = null )
		{
			_itemList.fixed = true;
			
			if( __cellNum != 0 ) _cellNum = __cellNum;
			if( __minCellSize != null ) _minCellSize = __minCellSize;
			if( __alignList != null )_alignList = __alignList;
		}
		
		
		/**
		 * 실제 정렬 가동을 하는 메서드 
		 */		
		public function workingAlign():void
		{
			
		}
		
		
		
		/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
		| children 관련 input, output
		|-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
		
		/**
		 * @param item AlignObject
		 */		
		public function addItem( item:AlignObject ):void
		{
			_itemList.fixed = false;
			_itemList.push( item );
			_itemList.fixed = true;
		}
		
		/**
		 * @param item AlignObject
		 */	
		public function removeItem( item:AlignObject ):void
		{
			var idx : int = _itemList.indexOf( item );
			if( idx == -1 ) return;
			
			_itemList.fixed = false;
			var removeItem : AlignObject = _itemList.splice( idx, 1 ) as AlignObject;
//			removeItem.box.destroy();
//			removeItem.info.destory();
			removeItem = null;
			_itemList.fixed = true;
		}
		
		/**
		 * @param item AlignObject
		 * @param idx 인덱스
		 */		
		public function addItemAt( item:AlignObject, idx:int ):void
		{
			_itemList.fixed = false;
			_itemList.splice( idx, 0, item );
			_itemList.fixed = true;
		}
		
		/**
		 * @param idx 해당 인덱스 아이템 제거
		 */		
		public function removeItemAt( idx:int ):void
		{
			if( _itemList.indexOf( idx ) > -1 )
			{
				_itemList.fixed = false;
				
				var item : AlignObject = _itemList.splice( idx, 1 ) as AlignObject;
//				item.box.destroy();
//				item.info.destroy();
				item = null;
				
				_itemList.fixed = true;
			}
		}
		
		
		
		/**
		 * @return 전체 리스트 반환
		 */		
		public function getList():Vector.<AlignObject>
		{
			return _itemList;
		}
		
		/**
		 * @param idx 인덱스 반환
		 * @return 해당 인덱스의 자식 반환
		 */		
		public function getItemAt( idx:int ):AlignObject
		{
			var item : AlignObject = null;
			if( _itemList && _itemList.length>idx ) item = _itemList[ idx ];
			
			return item;
		}
		
		/**
		 * @param item children ( AlignObject )
		 * @return 인덱스반환
		 */		
		public function getIndexAtItem( item:AlignObject ):int
		{
			return _itemList.indexOf( item );
		}
		
		/**
		 * @return 길이 반환 
		 */		
		public function get length():int
		{
			if( _itemList == null ) return 0;
			return _itemList.length;
		}
		
		
		
		
		
		
		
		
		
		
		
		
		
		/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
		| 설정 내용 setter, getter
		|-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
		
		
		public function set cellNum( __cellNum:int ):void
		{
			_cellNum = __cellNum;
		}
		
		public function get cellNum():int
		{
			return _cellNum;
		}
		
		public function set minCellSize( __minCellSize : Array ):void
		{
			_minCellSize = __minCellSize;
		}
		
		public function get minCellSize():Array
		{
			return _minCellSize;
		}
		
		public function set alignList( __alignList : Array ):void
		{
			_alignList = __alignList;
		}
		
		public function get alignList():Array
		{
			return _alignList;
		}
		
		
		
		
		
		/**
		 * @param ary 패딩셋팅
		 */		
		public function set padding( ary:Array ):void
		{
			if( ary.length < 4 )
			{
				var len : int = 4-ary.length;
				for( var i:int = 0; i<len; i++ ) ary.push( 0 );
			}
			
			_padding = ary;
		}
		
		/**
		 * @param num 패딩 윗부분
		 */		
		public function set paddingTop( num : Number ):void
		{
			_padding[ 0 ] = num;
		}
		
		/**
		 * @param num 패딩 오른쪽
		 */		
		public function set paddingRight( num : Number ):void
		{
			_padding[ 1 ] = num;
		}
		
		/**
		 * @param num 패딩 아래
		 */		
		public function set paddingBottom( num : Number ):void
		{
			_padding[ 2 ] = num;
		}
		
		/**
		 * @param num 패딩 왼쪽
		 */		
		public function set paddingLeft( num : Number ):void
		{
			_padding[ 3 ] = num;
		}
		
		
		/**
		 * @return 패딩 윗부분
		 */		
		public function get paddingTop():Number
		{
			return _padding[ 0 ];
		}
		
		/**
		 * @return 패딩 오른쪽 
		 */		
		public function get paddingRight():Number
		{
			return _padding[ 1 ];
		}
		
		/**
		 * @return 패딩 아래 
		 */		
		public function get paddingBottom():Number
		{
			return _padding[ 2 ];
		}
		
		/**
		 * @return 패딩 왼쪽 
		 */		
		public function get paddingLeft():Number
		{
			return _padding[ 3 ];
		}
		
		
		/**
		 * @return 각 셀 크기의 합 
		 */		
		public function get cellTotalSize():Number
		{
			var w : Number = 0;
			var len:int = _minCellSize.length;
			
			for( var i:int = 0; i<len; i++ )
			{
				w += _minCellSize[ i ];
			}
			
			return w;
		}
		
		
		
		
		
		
		
		/**
		 * @return 아이템들의 높이, 패딩 측정하여 높이반환
		 */		
		public function get heightMeasured():Number
		{
			var h : Number = 0;
			h += paddingTop;
			
			var len : int = _itemList.length;
			for( var i:int = 0; i<len; i++ )
			{
				h+= ( ( _itemList[i].box != null ) ? _itemList[i].box.height : _itemList[i].item.height ) + _itemList[i].info.paddingTop;
			}
			
			return h;
		}
		
		
		/**
		 * @return 아이템들의 너비, 패딩 측정하여 너비반환
		 */		
		public function get widthMeasured():Number
		{
			var w : Number = 0;
			w += paddingLeft;
			
			var len : int = _itemList.length;
			for( var i:int = 0; i<len; i++ )
			{
				w+= ( ( _itemList[i].box != null ) ? _itemList[i].box.width : _itemList[i].item.width ) + _itemList[i].info.paddingLeft;
			}
			
			return w;
		}
		
		
		
		/**
		 * @return 아이템 높이 < 높이는 주로 hbox 에서 참조한다 >
		 */		
		public function get height():Number
		{
			var h : Number = 0;
			var len : int = _itemList.length;
			for( var i:int = 0; i<len; i++ )
			{
				h = Math.max( h , ( _itemList[i].item != null ) ? _itemList[i].item.height : _itemList[i].box.height );
			}
			
			return h;
		}
		
		
		/**
		 * @return 아이템 너비 < 너비는 주로 vbox 에서 참조한다 >
		 */		
		public function get width():Number
		{
			var w : Number = 0;
			var len : int = _itemList.length;
			for( var i:int = 0; i<len; i++ )
			{
				w = Math.max( w , ( _itemList[i].item != null ) ? _itemList[i].item.width : _itemList[i].box.width );
			}
			
			return w;
		}
		
		
		
		
		
		
		public function set y( __y :Number ):void
		{
			_y = __y;
		}
		
		public function set x( __x :Number ):void
		{
			_x = __x;
		}
		
		public function get y():Number
		{
			return _y;
		}
		
		public function get x():Number
		{
			return _x;
		}
		
		
		
		
		
		
		public function destory():void
		{
			_itemList.fixed = false;
			var len : int = _itemList.length;
			for( var i:int = 0; i<len; i++ )
			{
				var item : AlignObject = _itemList.shift();
				item.box.destory();
				item.info.destory();
				item = null;
			}
			_itemList = null;
			_padding = null;
		}
		
	}
}



















